//定制请求的实例

//导入axios  npm install axios
import axios from 'axios';
import {ElMessage} from "element-plus";
//定义一个变量,记录公共的前缀  ,  baseURL
// const baseURL = 'http://localhost:8080';
const baseURL = '/api';
const instance = axios.create({baseURL})

//导入token状态
import { useTokenStore } from '@/stores/token.js';
//添加请求拦截器
instance.interceptors.request.use(
    (config)=>{
        //在发送请求之前做什么
        let tokenStore = useTokenStore();

        // 每次请求前都从存储中获取最新token，而不是依赖store中的状态
        // 因为store可能在页面刷新后丢失状态
        let currentToken = '';
        let rememberStatus = false;

        // 检查localStorage中是否有remember状态
        const rememberFromStorage = localStorage.getItem('remember');
        if (rememberFromStorage) {
            rememberStatus = JSON.parse(rememberFromStorage);
        }

        // 根据remember状态选择token来源
        if (rememberStatus) {
            currentToken = localStorage.getItem('token') || '';
        } else {
            currentToken = sessionStorage.getItem('token') || '';
        }

        // 更新store中的token值
        tokenStore.token = currentToken;

        //如果token中有值，则携带
        if(currentToken){
            config.headers.Authorization = currentToken;
        }
        return config;
    },
    (err)=>{
        //如果请求错误做什么
        Promise.reject(err);
    }
);

import router from '@/router'
//添加响应拦截器
instance.interceptors.response.use(
    result => {
        //判断业务状态码
        if(result.data.code === 0){
            return result.data;
        }
        //操作失败
        ElMessage.error(result.data.message ? result.data.message : '服务异常');
        //异步操作的状态转换为失败
        return Promise.reject(result.data);
    },
    err => {
        //如果响应状态码时401，代表未登录，给出对应的提示，并跳转到登录页
        if(err.response && err.response.status === 401){
            ElMessage.error('请先登录！');

            // 清除所有存储的token
            localStorage.removeItem('token');
            sessionStorage.removeItem('token');

            // 清除store中的token
            const tokenStore = useTokenStore();
            tokenStore.removeToken();

            router.push('/sign').then(r => {});
        }else{
            console.log(err);
            ElMessage.error(err.response?.data?.message || '服务异常');
        }
        return Promise.reject(err);//异步的状态转化成失败的状态
    }
);

export default instance;